package org.yzhzc.friend.manager;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import cn.hutool.core.bean.BeanUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.yzhzc.common.core.constants.CacheConstants;
import org.yzhzc.common.redis.service.RedisService;
import org.yzhzc.friend.domain.user.entity.User;
import org.yzhzc.friend.domain.user.vo.UserVO;
import org.yzhzc.friend.mapper.user.UserMapper;

import java.util.concurrent.TimeUnit;

/**
 * 用户缓存管理类，用于管理用户信息的缓存操作。
 */
@Component
public class UserCacheManager {

    @Autowired
    private RedisService redisService; // Redis 服务，用于操作缓存

    @Autowired
    private UserMapper userMapper; // 用户数据访问层，用于查询数据库

    /**
     * 根据用户ID获取用户信息。
     * 先从缓存中获取，如果缓存中没有，则从数据库中查询并刷新缓存。
     *
     * @param userId 用户ID
     * @return 用户信息视图对象（UserVO），如果用户不存在则返回 null
     */
    public UserVO getUserById(Long userId) {
        // 生成缓存键
        String userKey = getUserKey(userId);
        // 从缓存中获取用户信息
        UserVO userVO = redisService.getCacheObject(userKey, UserVO.class);
        if (userVO != null) {
            // 如果缓存中存在，延长缓存有效期
            redisService.expire(userKey, CacheConstants.USER_EXP, TimeUnit.MINUTES);
            return userVO;
        }
        // 如果缓存中不存在，从数据库中查询用户信息
        User user = userMapper.selectOne(new LambdaQueryWrapper<User>()
                .select(User::getUserId,
                        User::getNickName,
                        User::getHeadImage,
                        User::getSex,
                        User::getEmail,
                        User::getPhone,
                        User::getWechat,
                        User::getIntroduce,
                        User::getSchoolName,
                        User::getMajorName,
                        User::getStatus)
                .eq(User::getUserId, userId));
        if (user == null) {
            // 如果数据库中不存在该用户，返回 null
            return null;
        }
        // 刷新用户缓存
        refreshUser(user);
        // 将用户实体对象转换为视图对象
        userVO = new UserVO();
        BeanUtil.copyProperties(user, userVO);
        return userVO;
    }

    /**
     * 刷新用户缓存。
     * 将用户信息存入缓存，并设置缓存有效期。
     *
     * @param user 用户实体对象
     */
    public void refreshUser(User user) {
        // 生成缓存键
        String userKey = getUserKey(user.getUserId());
        // 将用户信息存入缓存
        redisService.setCacheObject(userKey, user);
        // 设置缓存有效期为 10 分钟
        redisService.expire(userKey, CacheConstants.USER_EXP, TimeUnit.MINUTES);
    }

    /**
     * 生成用户缓存键。
     * 格式为：u:d:用户ID
     *
     * @param userId 用户ID
     * @return 缓存键
     */
    private String getUserKey(Long userId) {
        return CacheConstants.USER_DETAIL + userId;
    }
}